/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view;

import java.io.IOException;
import java.util.ArrayList;
import model.dao.AlunoDaoImpl;
import model.dao.AtividadeDaoImpl;
import model.dao.DisciplinaDaoImpl;
import model.dao.FaltaDaoImpl;
import model.dao.HistoricoAlunoDaoImpl;
import model.dao.NotaDaoImpl;
import model.dao.ProfessorDaoImpl;
import model.dao.TurmaDaoImpl;
import model.pojo.Disciplina;
import model.pojo.Professor;
import model.pojo.Turma;
import model.pojo.HistoricoAluno;
import model.pojo.Aluno;

/**
 *
 * @author leonidia
 */
public final class MenuPrincipal {

    private Integer usuario = -1;
    private Integer flag;
    DisciplinaDaoImpl disciplinaImpl = new DisciplinaDaoImpl();
    DisciplinaView disciplinaView = new DisciplinaView(disciplinaImpl);
    TurmaDaoImpl turmaImpl = new TurmaDaoImpl();
    TurmaView turmaView = new TurmaView(turmaImpl);
    AtividadeDaoImpl atividadeImpl = new AtividadeDaoImpl();
    AtividadeView atividadeView = new AtividadeView(atividadeImpl);
    NotaDaoImpl notaImpl = new NotaDaoImpl();
    NotaView notaView = new NotaView(notaImpl);
    FaltaDaoImpl faltaImpl = new FaltaDaoImpl();
    FaltaView faltaView = new FaltaView(faltaImpl);
    AlunoDaoImpl alunoImpl = new AlunoDaoImpl();
    AlunoView alunoView = new AlunoView(alunoImpl);
    ProfessorDaoImpl professorImpl = new ProfessorDaoImpl();
    ProfessorView professorView = new ProfessorView(professorImpl);
    HistoricoAlunoDaoImpl historicoImpl = new HistoricoAlunoDaoImpl();
    HistoricoAlunoView historicoView = new HistoricoAlunoView(historicoImpl);

    public MenuPrincipal() throws IOException {
        this.usuario = -1;
        this.disciplinaImpl = new DisciplinaDaoImpl();
        this.disciplinaView = new DisciplinaView(disciplinaImpl);
        this.turmaImpl = new TurmaDaoImpl();
        this.turmaView = new TurmaView(turmaImpl);
        this.alunoImpl = new AlunoDaoImpl();
        this.alunoView = new AlunoView(alunoImpl);
        this.professorImpl = new ProfessorDaoImpl();
        this.professorView = new ProfessorView(professorImpl);
        this.historicoImpl = new HistoricoAlunoDaoImpl();
        this.historicoView = new HistoricoAlunoView(historicoImpl);

        while (usuario != 2) {
            System.out.println("Escolha o tipo de Usuário");
            System.out.println("0-Administrador");
            System.out.println("1-Professor");
            System.out.println("2-encerrar Programa");
            usuario = Console.readInteger();
            switch (usuario) {
                case 0: {
                    menuAdministrador();
                    if (this.flag == 0) {
                        usuario = 2;
                        System.out.println("Encerrando programa");
                    }
                    break;
                }
                case 1: {
                    menuProfessor();
                    if (this.flag == 0) {
                        usuario = 2;
                        System.out.println("Encerrando programa");
                    }
                    break;
                }
                case 2: {
                    System.out.println("Encerrando programa");
                    break;
                }
            }
        }
    }

    /**
     *
     * @throws IOException Lança exceção caso haja erro ao criar arquivo.
     */
    @SuppressWarnings("CallToThreadDumpStack")
    public void menuProfessor() throws IOException {
        this.flag = 1;
        Integer resposta;
        System.out.println("Digite seu cpf");
        String cpf = Console.readString();
        Integer idProfessor = professorImpl.buscaIdProfessorPorCpf(cpf);
        if (idProfessor == -1) {
            System.out.println("Digite seu cpf");
            return;
        } else {
            resposta = 0;
        }
        while (resposta != 11) {

            System.out.println("#######MENU-PROFESSOR########");
            System.out.println("0-Cadastrar Atividade");
            System.out.println("1-Listar Atividade");
            System.out.println("2-Cadastrar Notas");
            System.out.println("3-Listar Notas");
            System.out.println("4-Cadastrar Faltas");
            System.out.println("5-Listar Faltas");
            System.out.println("6-Consultar o numero de turmas ja oferecidas (historicamente) para uma determinada disciplina.");
            System.out.println("7-Consultar o numero de disciplinas ja lecionadas.");
            System.out.println("8-Consultar turmas (informando disciplina, ano e periodo). Para listar as notas e faltas dos alunos.");
            System.out.println("9-Consultar a situacão de um aluno em uma disciplina - exibir nota, faltas e se ele foi aprovado ou reprovado");
            System.out.println("10-voltar ao menu principal");
            System.out.println("11-Fechar");

            System.out.println("Digite a oção desejada");
            resposta = Console.readInteger();
            switch (resposta) {
                case 0: {
                    turmaView.listarTurmaPorIdProfessor(idProfessor);
                    System.out.println("digite o id da Turma que deseja cadastrar a Atividade");
                    Integer idTurma = Console.readInteger();
                    atividadeImpl.salvarAtividade(atividadeView.addAtividadePorTurma(idTurma));
                    atividadeImpl.salvarAtividadeTurma();
                    break;
                }
                case 1: {
                    if (turmaView.listarTurmaPorIdProfessor(idProfessor)) {
                        System.out.println("digite o id da Turma que deseja listar as Atividade");
                        Integer idTurma = Console.readInteger();
                        atividadeView.listarAtividadePorIdTurma(idTurma);
                    }
                    break;
                }
                case 2: {
                    if (turmaView.listarTurmaPorIdProfessor(idProfessor)) {
                        System.out.println("digite o id da Turma que deseja cadastrar a nota");
                        Integer idTurma = Console.readInteger();
                        if (atividadeView.listarAtividadePorIdTurma(idTurma) == false) {
                            break;
                        }
                        System.out.println("digite o id da Atividade que deseja cadastrar a nota");
                        Integer idAtividade = Console.readInteger();
                        Integer idAluno = 0;
                        while (idAluno != -1) {
                            if (alunoView.listarAlunosPorId(turmaImpl.getAlunoPorIdTurma(idTurma))) {
                                System.out.println("digite o id do Aluno que deseja cadastrar a nota/se deseja parar digite -1");
                                idAluno = Console.readInteger();
                                if (idAluno != -1) {
                                    notaView.addNotaAluno(idAluno, idAtividade);
                                    historicoImpl.atualizarNota(idAluno, idTurma, notaImpl.getNotas().get(notaImpl.getNotas().size() - 1).getNota());
                                }
                            } else {
                                idAluno = -1;
                            }
                        }
                        notaImpl.salvarNota(notaImpl.getNotas());
                        notaImpl.salvarAssocNota();
                        historicoImpl.salvarAssocHistoricoAluno();
                    }
                    break;
                }
                case 3: {
                    notaView.listarNotaAluno();
                    break;
                }
                case 4: {
                    if (turmaView.listarTurmaPorIdProfessor(idProfessor)) {
                        System.out.println("digite o id da Turma que deseja cadastrar a falta");
                        Integer idTurma = Console.readInteger();

                        Integer idAluno = -2;
                        while (idAluno != -1) {
                            if (alunoView.listarAlunosPorId(turmaImpl.getAlunoPorIdTurma(idTurma)) == false) {
                                break;
                            }
                            System.out.println("digite o id do Aluno que deseja cadastrar a Falta/se deseja parar digite -1");
                            idAluno = Console.readInteger();
                            if (idAluno != -1) {
                                faltaView.addFaltaAluno(idAluno, idTurma);
                                System.out.println("10-Cadastrar Faltas");
                            }
                        }
                        faltaImpl.salvarAssocFalta();
                        faltaImpl.salvarFalta(faltaImpl.getFalta());
                        historicoImpl.salvarAssocHistoricoAluno();
                    }
                    break;
                }
                case 5: {
                    if (turmaView.listarTurmaPorIdProfessor(idProfessor)) {
                        System.out.println("digite o id da Turma que deseja conferir as faltas");
                        Integer idTurma = Console.readInteger();
                        faltaView.listarFalta(idTurma);
                    }
                    break;
                }
                case 6: {
                    System.out.println("digite  o nome da disciplina que deseja consultar");
                    String nomeDisciplina = Console.readString();
                    ArrayList<Disciplina> listaDisciplina = disciplinaImpl.getDisciplinas();
                    int i,
                            cont = 0;
                    for (i = 0; i < listaDisciplina.size(); i++) {
                        if (listaDisciplina.get(i).getNome().equals(nomeDisciplina)) {
                            cont = turmaImpl.contadorDisciplina(listaDisciplina.get(i).getId()) + cont;
                        }
                    }
                    System.out.println("numero de turma(s) " + cont);
                    break;
                }
                case 7: {
                    ArrayList<Professor> listaProfessor = professorImpl.getProfessores();
                    int i, cont = 0;
                    for (i = 0; i < listaProfessor.size(); i++) {
                        if (listaProfessor.get(i).getId() == idProfessor) {
                            cont = turmaImpl.contadorProfessor(idProfessor);
                        }
                    }
                    System.out.println("numero de Disciplinas(s) " + cont);
                    break;
                }
                case 8: {
                    ArrayList<Turma> listaTurma = turmaImpl.getListaTurma();
                    ArrayList<Disciplina> listaDisciplina = disciplinaImpl.getDisciplinas();
                    ArrayList<Aluno> listaAluno = alunoImpl.getAluno();
                    ArrayList<HistoricoAluno> listaHistoricoAluno = historicoImpl.getHistoricoAluno();
                    ArrayList<Integer> listaIdTurma = historicoImpl.getListaIdTurma();
                    ArrayList<Integer> listaIdDisciplina = historicoImpl.getListaIdDisciplina();
                    ArrayList<Integer> listaIdAluno = historicoImpl.getListaIdAluno();
                    ArrayList<Integer> listaIdHistorico = historicoImpl.getListaIdHistorico();
                    ArrayList<Integer> idTurmaTmp = new ArrayList<>();

                    Integer i, j, nAulas = 1, anoTurma = -2, periodoTurma = -2;

                    if (disciplinaView.ListarDisciplinaPorListaIdProfessor(turmaImpl.getDisciplinaAssocIdProfessor(idProfessor))) {
                        System.out.println("Digite o Id da Disciplina");
                        Integer idDisciplina = Console.readInteger();

                        for (i = 0; i < listaIdDisciplina.size(); i++) {
                            if (listaIdDisciplina.get(i) == idDisciplina) {
                                idTurmaTmp.add(listaIdTurma.get(i));
                            }
                        }

                        if (idTurmaTmp.isEmpty()) {
                            System.out.println("Não há turmas para esta disciplina.");
                            break;
                        }

                        for (i = 0; i < idTurmaTmp.size(); i++) {
                            turmaView.listarTurmaPorId(idTurmaTmp.get(i));
                        }

                        System.out.println("Digite o Ano");
                        anoTurma = Console.readInteger();

                        for (i = 0; i < idTurmaTmp.size(); i++) {
                            if (listaTurma.get(i).getAno() == anoTurma) {
                                turmaView.listarTurmaPorId(idTurmaTmp.get(i));
                            } else {
                                idTurmaTmp.remove(i);
                            }
                        }

                        System.out.println("Digite o Periodo");
                        periodoTurma = Console.readInteger();

                        for (i = 0; i < idTurmaTmp.size(); i++) {
                            if (listaTurma.get(i).getPeriodo() != periodoTurma) {
                                idTurmaTmp.remove(i);
                            }
                        }

                        for (i = 0; i < idTurmaTmp.size(); i++) {
                            for (Integer id : idTurmaTmp) {
                                historicoView.ImprimirAlunosNotasEFaltas(id);
                            }
                        }
                    }
                    break;
                }
                case 9: {
                    ArrayList<Disciplina> listaDisciplina = disciplinaImpl.getDisciplinas();
                    ArrayList<Aluno> listaAluno = alunoImpl.getAluno();
                    ArrayList<HistoricoAluno> listaHistoricoAluno = historicoImpl.getHistoricoAluno();
                    ArrayList<Integer> listaIdTurma = historicoImpl.getListaIdTurma();
                    ArrayList<Integer> listaIdDisciplina = historicoImpl.getListaIdDisciplina();
                    ArrayList<Integer> listaIdAluno = historicoImpl.getListaIdAluno();
                    ArrayList<Integer> listaIdHistorico = historicoImpl.getListaIdHistorico();


                    Integer i, j, nAulas = 1, idDisciplina = -2, idAluno = -2;

                    disciplinaView.ListarDisciplinaPorProfessor(idProfessor);

                    System.out.println("Digite a Disciplina");
                    String nomeDisciplina = Console.readString();

                    for (i = 0; i < listaDisciplina.size(); i++) {
                        if (listaDisciplina.get(i).getNome().equals(nomeDisciplina)) {
                            idDisciplina = listaDisciplina.get(i).getId();
                            nAulas = listaDisciplina.get(i).getCargaHoraria();
                        }
                    }

                    alunoView.listarAlunosPorDisciplina(idDisciplina);

                    System.out.println("Digite o nome do Aluno");
                    String nomeAluno = Console.readString();

                    for (i = 0; i < listaAluno.size(); i++) {
                        if (listaAluno.get(i).getNome().equals(nomeAluno)) {
                            idAluno = listaAluno.get(i).getId();
                        }
                    }

                    if (idAluno == -2 || idDisciplina == -2) {
                        System.out.println("Falha, aluno e/ou disciplina não existe");

                    }
                    for (i = 0; i < listaIdTurma.size(); i++) {
                        if (idAluno == listaIdAluno.get(i) && idDisciplina == listaIdDisciplina.get(i)) {
                            for (j = 0; j < listaHistoricoAluno.size(); j++) {
                                if (listaHistoricoAluno.get(j).getId() == listaIdHistorico.get(i)) {
                                    double frequencia = ((listaHistoricoAluno.get(j).getFalta() - nAulas) * 100) / nAulas;
                                    if (frequencia > 75 && listaHistoricoAluno.get(j).getNota() > 6) {
                                        System.out.println("Aluno Aprovado!");
                                    } else {
                                        System.out.println("Aluno Reprovado");
                                    }
                                }
                            }
                        }
                    }
                    break;
                }
                case 10: {
                    resposta = 11;
                    break;
                }
                case 11: {
                    this.flag = 0;
                    break;
                }
            }
        }
    }

    @SuppressWarnings("CallToThreadDumpStack")
    public void menuAdministrador() throws IOException {
        this.flag = 1;
        Integer resposta = 0;
        while (resposta != 13) {
            System.out.println("#######MENU-ADMINISTRADOR########");
            System.out.println("0-Cadastrar Turma");
            System.out.println("1-Listar Turma");
            System.out.println("2-Cadastrar Diciplina");
            System.out.println("3-Listar Diciplinas");
            System.out.println("4-Cadastrar Professor");
            System.out.println("5-Listar Professor");
            System.out.println("6-Cadastrar Aluno");
            System.out.println("7-Listar Aluno");
            System.out.println("8-Consultar turmas - alunos com suas notas e faltas");
            System.out.println("9-Consultar a situação de um aluno em uma disciplina - exibir nota e faltas, e se foi aprovado ou não");
            System.out.println("10-Consultar o numero de disciplinas ja lecionadas por um determinado professor");
            System.out.println("11-consultar numero de turmas ja oferecidas historicamente em determinada disciplina");
            System.out.println("12-voltar ao menu principal");
            System.out.println("13-Fechar");
            System.out.println("Digite a oção desejada");
            resposta = Console.readInteger();
            switch (resposta) {
                case 0: {
                    /**
                     * Cadastro de disciplina na Turma
                     */
                    Integer idDisciplina;
                    if (disciplinaView.ListarDisciplina() == 1) {
                        System.out.println("A Disciplina desta turma está cadastrada?1-sim/0-nao");
                        if (Console.readInteger() == 1) {
                            System.out.println("digite o id da Disciplina");
                            idDisciplina = Console.readInteger();
                        } else {
                            disciplinaImpl.setDisciplina(disciplinaView.addDisciplina());
                            idDisciplina = disciplinaImpl.ultimoId();
                        }
                    } else {
                        disciplinaImpl.setDisciplina(disciplinaView.addDisciplina());
                        idDisciplina = disciplinaImpl.ultimoId();
                    }
                    turmaImpl.addListaDisciplinas(idDisciplina);
                    try {
                        disciplinaImpl.salvarDisciplina(disciplinaImpl.getListaDisciplina());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    /**
                     * Cadastro de Professor na Turma
                     */
                    Integer idProfessor;
                    System.out.println("professores cadastrados: ");
                    if (professorView.ListarProfessor() == 1) {
                        System.out.println("O professor desta turma está cadastrado?1-sim/0-nao");
                        if (Console.readInteger() == 1) {
                            System.out.println("digite o id do professor");
                            idProfessor = Console.readInteger();
                        } else {
                            professorImpl.setProfessor(professorView.addProfessor());
                            idProfessor = professorImpl.ultimoId();
                        }
                    } else {
                        professorImpl.setProfessor(professorView.addProfessor());
                        idProfessor = professorImpl.ultimoId();
                    }
                    turmaImpl.addListaProfessores(idProfessor);
                    try {
                        professorImpl.salvarProfessor(professorImpl.getList());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }

                    /**
                     * incricão da turma
                     */
                    turmaImpl.setTurma(turmaView.addTurma());
                    Integer idTurma = turmaImpl.ultimoId();
                    try {
                        turmaImpl.salvarTurma(turmaImpl.getTurma());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    turmaImpl.addListaTurmas(idTurma);
                    System.out.println("deseja cadastrar aluno/alunos a esta turma ? 1-sim/0-nao");
                    Integer i = 0;
                    if (Console.readInteger() == 1) {
                        while (i < turmaImpl.getTurma().get(turmaImpl.getTurma().size() - 1).getNumeroDeVagas()) {
                            System.out.println(" Alunos cadastrados: ");
                            Integer idAluno;
                            if (alunoView.ListarAluno() == true) {
                                System.out.println("Se o aluno ja estiver cadastrado digite o id do mesmo, se não digite -1");
                                idAluno = Console.readInteger();
                                if (idAluno != -1) {
                                    turmaImpl.addListaTurmaAlunos(idAluno, idTurma);
                                    HistoricoAluno historico = new HistoricoAluno(historicoImpl.novoId(), Float.valueOf("0"), 0);
                                    historicoImpl.addHistoricoAluno(historico, historico.getId(), idAluno, idTurma, idDisciplina);
                                } else {
                                    alunoImpl.setAluno(alunoView.addAluno());
                                    idAluno = alunoImpl.ultimoId();
                                    turmaImpl.addListaTurmaAlunos(idAluno, idTurma);
                                    
                                    HistoricoAluno historico = new HistoricoAluno(historicoImpl.novoId(), Float.valueOf("0"), 0);
                                    historicoImpl.addHistoricoAluno(historico, historico.getId(), idAluno, idTurma, idDisciplina);
                                }
                            } else {
                                alunoImpl.setAluno(alunoView.addAluno());
                                idAluno = alunoImpl.ultimoId();
                                turmaImpl.addListaTurmaAlunos(idAluno, idTurma);
                                HistoricoAluno historico = new HistoricoAluno(historicoImpl.novoId(), Float.valueOf("0"), 0);
                                historicoImpl.addHistoricoAluno(historico, historico.getId(), idAluno, idTurma, idDisciplina);
                            }
                            /**
                             * Cadastro de aluno na turma
                             */
                            System.out.println("Deseja cadastrar mais alunos a esta turma? 1-sim/ 0-não");
                            if (Console.readInteger() == 0) {
                                try {
                                    alunoImpl.salvarAluno(alunoImpl.getAluno());
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                                turmaImpl.salvarAssociacaoTurmaAluno();
                                historicoImpl.salvarAssocHistoricoAluno();
                                historicoImpl.salvarHistoricoAluno();
                                break;
                            }
                            i++;
                        }
                    }
                    turmaImpl.salvarAssociacaoTurma();
                    break;
                }
                case 1: {
                    turmaView.ListarTurma();
                    break;
                }
                case 2: {
                    disciplinaImpl.setDisciplina(disciplinaView.addDisciplina());
                    try {
                        disciplinaImpl.salvarDisciplina(disciplinaImpl.getListaDisciplina());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    break;
                }
                case 3: {
                    disciplinaView.ListarDisciplina();
                    break;
                }
                case 4: {
                    professorImpl.setProfessor(professorView.addProfessor());
                    try {
                        professorImpl.salvarProfessor(professorImpl.getList());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    break;
                }
                case 5: {
                    professorView.ListarProfessor();
                    break;
                }
                case 6: {
                    alunoImpl.setAluno(alunoView.addAluno());
                    try {
                        alunoImpl.salvarAluno(alunoImpl.getAluno());
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                    break;
                }
                case 7: {
                    alunoView.ListarAluno();
                    break;
                }
                case 8: {
                    System.out.println("12-Consultar turmas - alunos com suas notas e faltas");
                    break;
                }
                case 9: {
                    System.out.println("13-Consultar a situação de um aluno em uma disciplina - exibir nota e faltas, e se foi aprovado ou não");

                }
                case 10: {
                    System.out.println("14- consultar o numero de disciplinas ja lecionadas por um determinado professor");
                    System.out.println("digite  o nome do professor que deseja consultar");
                    String nomeProfessor = Console.readString();
                    ArrayList<Professor> listaProfessor = professorImpl.getProfessores();
                    int i, cont = 0;
                    for (i = 0; i < listaProfessor.size(); i++) {
                        if (listaProfessor.get(i).getNome().equals(nomeProfessor)) {
                            cont = turmaImpl.contadorProfessor(listaProfessor.get(i).getId());
                            break;
                        }
                    }
                    System.out.println("numero de turma(s) " + cont);
                    break;
                }
                case 11: {
                    System.out.println("15-consultar numero de turmas ja oferecidas historicamente em determinada disciplina");
                    System.out.println("digite  o nome da disciplina que deseja consultar");
                    String nomeDisciplina = Console.readString();
                    ArrayList<Disciplina> listaDisciplina = disciplinaImpl.getDisciplinas();
                    int i, cont = 0;
                    for (i = 0; i < listaDisciplina.size(); i++) {
                        if (listaDisciplina.get(i).getNome().equals(nomeDisciplina)) {
                            cont = turmaImpl.contadorDisciplina(listaDisciplina.get(i).getId());
                        }
                    }
                    System.out.println("numero de turma(s) " + cont);
                    break;
                }
                case 12: {
                    System.out.println("16-voltar ao menu principal");
                    resposta = 13;
                    break;
                }
                case 13: {
                    System.out.println("17-Fechar");
                    this.flag = 0;
                    break;
                }
            }
        }
    }

    public void setUsuario(Integer usuario) {
        this.usuario = usuario;
    }

    public Integer getFlag() {
        return this.flag;
    }

    public void setFlag(Integer flag) {
        this.flag = flag;
    }
}